/* 
    对象类型的写法:变量名:{属性名1：Type1;属性名2：Type2;...}
    在一行代码中指定对象的多个属性类型时，使用`;`（分号）来分隔
*/

//对象的创建 属性和方法声明
//创建空对象
let obj: {} = {}

//有属性对象
//定义几个属性名和对应的类型，赋值时候只能有几个属性名和属性值
let obj2: {
    name: string;
    age: number;
    str?: string;//这个是可选值
};
obj2 = {
    name: "我是谁",
    age: 12,
    str: "可选择",//这个是可选值，可有可没有
}
console.log(obj2);


//对象  属性或方法 可选值
let person:{name:string,age?:number,eat?():void}
person={
    name:"123",
    age:123,
    eat() {
        console.log("123");
        return 123
    },
}
console.log(person);
console.log(person.eat);

// 对象 对象类型-带有参数的方法类型
let person2:{name:string,age:number,eat(a:string):void}
let person3:{name:string,age:number,eat:(a:string)=>void};//箭头函数
person2={
    name:"123",
    age:123,
    eat(a) {
        console.log(a);
        //返回值是void 下面两种都可以
        // return '1231234235'
        return 1231234235
    },
}
person2.eat('11111111111111');//带参数调试
// ea?t(a:string):void 方法如果是可选地 需要关闭严格模式 才可以调用
//tsconfig.json 里面的 "strict": false,  


//任意属性，多个属性名
//应为我们定义了[propName: string]:any
//允许添加新的任意属性
//前面是必须的，后面可以任意添加新的属性，不限制个数
let objAny:{
    user:string,
    age?:number,
    [propName:string]:any
}
objAny={
    user:"sdfsd",
    age:20,
    aa:12342,
    bb:"撒的发生",
    cc:false,
    dd:[]
}










export { }